package cn.tedu.suppermemory.service.impl;


import cn.tedu.suppermemory.ex.ServiceException;
import cn.tedu.suppermemory.mapper.RoleMapper;
import cn.tedu.suppermemory.pojo.dto.RoleAddNewDTO;
import cn.tedu.suppermemory.pojo.dto.RoleUpdateDTO;
import cn.tedu.suppermemory.pojo.dto.TeacherUpdateDTO;
import cn.tedu.suppermemory.pojo.entity.Role;
import cn.tedu.suppermemory.pojo.entity.Teacher;
import cn.tedu.suppermemory.pojo.vo.RoleListItemVO;
import cn.tedu.suppermemory.pojo.vo.RoleStandardVO;
import cn.tedu.suppermemory.pojo.vo.TeacherListItemVO;
import cn.tedu.suppermemory.pojo.vo.TeacherStandardVO;
import cn.tedu.suppermemory.service.IRoleService;
import cn.tedu.suppermemory.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import java.util.List;

/**
 * 处理角色数据的业务实现类
 *
 * @author java@徐闯
 * @version 0.0.1
 */
@Slf4j
@Controller
public class RoleServiceImpl implements IRoleService {

    @Autowired
    private RoleMapper roleMapper;

    @Override
    public void addNew(RoleAddNewDTO roleAddNewDTO) {
        log.debug("开始处理【添加角色】的业务，参数：{}",roleAddNewDTO);
        //检查角色是否已存在
        String name = roleAddNewDTO.getName();
        int countByName = roleMapper.countByName(name);
        if (countByName > 0 ){
            String message = "添加角色失败，该角色名称已被占用！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
        }
        //创建Role对象
        Role role =new Role();
        BeanUtils.copyProperties(roleAddNewDTO, role);
        // 执行插入数据：roleMapper.insert(role)
        log.debug("即将插入数据，参数：{}", role);
        int rows = roleMapper.insert(role);
        if (rows != 1) {
            String message = "添加角色失败，服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_INSERT, message);
        }
    }


    @Override
    public void delete(Long id) {
        log.debug("开始处理【根据id删除角色】的业务，参数：{}", id);
        {
            // 调用Mapper的getStandardById()执行查询，检查数据是否不存在
            RoleStandardVO role = roleMapper.getStandardById(id);
            // 是：数据不存在，抛出异常
            if (role == null) {
                String message = "删除角色失败，尝试删除的数据不存在！";
                log.warn(message);
                throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
            }
        }
        log.debug("即将执行删除，参数：{}", id);
        int rows = roleMapper.deleteById(id);
        if (rows != 1) {
            String message = "删除角色失败，服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_DELETE, message);
        }
    }
    @Override
    public void updateInfoById(Long id, RoleUpdateDTO roleUpdateDTO) {
        log.debug("开始处理【修改角色详情】的业务，参数ID：{}，新数据：{}", id, roleUpdateDTO);
        {
            // 调用Mapper的getStandardById()执行查询，检查数据是否不存在
            RoleStandardVO role = roleMapper.getStandardById(id);
            // 是：数据不存在，抛出异常
            if (role == null) {
                String message = "修改role详情失败，尝试访问的数据不存在！";
                log.warn(message);
                throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
            }
        }
        {
            // 调用Mapper的countByName()执行查询，检查新的名称是否已经被别的数据占用
            int count = roleMapper.countByName(roleUpdateDTO.getName());//
            // 是：名称被别的数据占用，抛出异常（NOT_CONFLICT）
            if (count > 0) {
                String message = "修改角色详情失败，新的角色名称已经被占用！";
                log.warn(message);
                throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
            }
        }
        
    }
    @Override
    public RoleStandardVO getStandardById(Long id) {
        log.debug("开始处理【根据id查询角色详情】的业务，参数：{}", id);
        RoleStandardVO role = roleMapper.getStandardById(id);
        if (role == null) {
            String message = "查询角色详情失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        log.debug("即将返回查询结果：{}", role);
        return role;
    }

    @Override
    public List<RoleListItemVO> list() {
        log.debug("开始处理【查询角色列表】的业务，无参数");
        List<RoleListItemVO> list = roleMapper.list();
        log.debug("即将返回查询结果：{}", list);
        return list;
    }
}
